import jenksBreaks from "./jenks_breaks.js";
import jenksMatrices from "./jenks_matrices.js";

/**
 * **[Jenks自然间断优化算法](http://en.wikipedia.org/wiki/Jenks_natural_breaks_optimization)**
 * 是一种常用于制图和可视化中的算法，用于决定数据值的分组，以最小化组内方差并最大化组间差异。
 *
 * 例如，制图师通常使用Jenks算法来选择在[等值区域图](https://en.wikipedia.org/wiki/Choropleth_map)中
 * 哪些值被分配给哪些颜色。
 *
 * @param {Array<number>} data 输入数据，作为数字值的数组
 * @param {number} nClasses 期望的类别数量
 * @returns {Array<number>} 类别间断点的数组
 * // 将数据分成3个间断点
 * jenks([1, 2, 4, 5, 7, 9, 10, 20], 3) // = [1, 7, 20, 20]
 */
function jenks(data, nClasses) {
    if (nClasses > data.length) {
        return null;
    }

    // 按数字顺序排序数据，因为这是矩阵函数所期望的
    data = data.slice().sort(function (a, b) {
        return a - b;
    });

    // 获取基础矩阵
    const matrices = jenksMatrices(data, nClasses);
    // 我们只需要下类限
    const lowerClassLimits = matrices.lowerClassLimits;

    // 从计算的矩阵中提取nClasses
    return jenksBreaks(data, lowerClassLimits, nClasses);
}

export default jenks;
